
//467.环绕字符串种唯一的子字符串
class Solution {
public:
    int findSubstringInWraproundString(string s) {
        //环绕字符串种唯一的子字符串
        //因为不能有重复的子字符串所以要进行筛选
        //如果直接存储每个已经存在的子字符串效率太低
        
        //可以使用一个哈希表来存储每一个以当前字符结尾的子字符串的个数
        //以当前字符为结尾，使得循环可以一直向后走也能记录每一个子字符串

        int n=s.size();
        int i=0,ret=0;
        int l=0;
        vector<int> length(26,0);  //记录以每一个字符为结尾字符串的长度
        for(int i=0;i<n;i++)
        {
            if(i>0&&(s[i-1]-'a'+1)%26!=s[i]-'a') l=i;  //如果不是环绕字符串重新开始

            int len=i-l+1;    //计算前面环绕字符串的长度
            if(len>length[s[i]-'a'])   //如果以当前字符结尾的字符串长度比之前数组种记录的更长就需要对结果进行更新
            {
                ret+=len-length[s[i]-'a'];
                length[s[i]-'a']=len;
            }
        }
        return ret;
    }
};